package com.zzyy.study.trace;

import org.slf4j.MDC;

/**
 * @auther zzyy
 * @create 2024-04-18 19:32
 *
 * org.slf4j.MDC;
 * 是 SLF4J（Simple Logging Facade for Java）库中的一个组件，它代表 Mapped Diagnostic Context。MDC
 * 提供了一种机制，允许你在日志消息中插入上下文信息，这些信息可以跨多个方法调用和线程边界传播。
 * 这对于跟踪和调试分布式系统或多线程应用程序中的请求非常有用。
 *
 * MDC 允许你将键值对与当前线程关联起来。然后，你可以在你的日志语句中引用这些值，
 * 从而能够更容易地识别和理解日志消息产生的上下文。
 *
 * 例如，你可能会在 Web 应用程序的每个请求开始时，将用户的 ID 或会话 ID 放入 MDC，
 * 然后在你的日志语句中引用这个值。这样，当你查看日志时，你可以很容易地看到哪个用户的哪个请求产生了哪些日志消息。
 *
 * 使用 MDC 的基本步骤如下：
 * 设置值：                 MDC.put("userId", "12345");
 * 在日志语句中使用值：       logger.info("Processing request for user: {}", MDC.get("userId"));
 * 清除值：                 MDC.remove("userId");
 */
public class TraceUtils
{
    public static final String TRACE_ID = "traceId";
    public static ThreadLocal<String> traceIdThreadLocal = new ThreadLocal<>();

    public static void setTraceId(String traceId) {
        traceIdThreadLocal.set(traceId);
        MDC.put(TRACE_ID, traceId);
    }

    public static String getTraceId() {
        return traceIdThreadLocal.get();
    }

    public static void removeTraceId() {
        traceIdThreadLocal.remove();
        MDC.remove(TRACE_ID);
    }
}
